{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6bYaCABobL5q"
      },
      "source": [
        "##### Copyright 2018 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "FlUw7tSKbtg4"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "08OTcmxgqkc2"
      },
      "source": [
        "# コードを TensorFlow 2 に自動的にアップグレードする\n",
        "\n",
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>     <a target=\"_blank\" href=\"https://www.tensorflow.org/guide/upgrade\">     <img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\">     \tTensorFlow.orgで表示</a>\n",
        "</td>\n",
        "  <td>     <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ja/guide/upgrade.ipynb\">     <img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\">     \tGoogle Colabで実行</a>\n",
        "</td>\n",
        "  <td><a target=\"_blank\" href=\"https://github.com/tensorflow/docs-l10n/blob/master/site/ja/guide/upgrade.ipynb\">     <img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\">     GitHubでソースを表示</a></td>\n",
        "  <td>     <a target=\"_blank\" href=\"https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ja/guide/upgrade.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\">ノートブックをダウンロード</a>\n",
        "</td>\n",
        "</table>\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hZSaRPoybOp5"
      },
      "source": [
        "TensorFlow 2.0には引数の並べ替え、シンボル名の変更、パラメータのデフォルト値の変更など、多くのAPIの変更が含まれています。これらの変更をすべて手動で実行するのは退屈で、エラーが発生しやすくなります。変更を合理化し、可能な限りシームレスに TF 2.0 に移行できるよう、TensorFlow チームはレガシーコードの新しい API への移行を支援する `tf_upgrade_v2` ユーティリティを作成しています。\n",
        "\n",
        "注意: `tf_upgrade_v2` は TensorFlow 1.13 以降（すべての TF 2.0 ビルドを含む）に自動的にインストールされています。\n",
        "\n",
        "一般的な使用方法は以下のとおりです。\n",
        "\n",
        "<pre class=\"devsite-terminal devsite-click-to-copy prettyprint lang-bsh\">tf_upgrade_v2 \\<br>  --intree my_project/ \\<br>  --outtree my_project_v2/ \\<br>  --reportfile report.txt</pre>\n",
        "\n",
        "これにより、既存の TensorFlow 1.x Python スクリプトが TensorFlow 2.0 に変換され、アップグレード処理が高速化します。\n",
        "\n",
        "この変換スクリプトは可能な限り自動化を行いますが、スクリプトでは実行できない構文やスタイルの変更もあります。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gP9v2vgptdfi"
      },
      "source": [
        "## 互換性モジュール\n",
        "\n",
        "いくつかの API シンボルは単に文字列置換を使用するだけではアップグレードできません。コードを確実に TensorFlow 2.0 に対応させるため、アップグレードスクリプトには `compat.v1` モジュールが含まれています。このモジュールは `tf.foo` のような TF 1.x のシンボルを同等の `tf.compat.v1.foo` 参照に置換します。この互換性モジュールは優れていますが、置換箇所を手作業で見直し、それらを `tf.compat.v1` 名前空間ではなく `tf.*` 名前空間の新しい API に早急に移行することをお勧めします。\n",
        "\n",
        "TensorFlow 2.x で廃止されているモジュール（`tf.flags` や `tf.contrib` など）があるため、一部の変更は `compat.v1` に切り替えても対応できません。このようなコードをアップグレードするには、追加のライブラリ（[`absl.flags`](https://github.com/abseil/abseil-py) など）を使用するか、[tensorflow/addons](http://www.github.com/tensorflow/addons) にあるパッケージに切り替える必要があるかもしれません。\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "s78bbfjkXYb7"
      },
      "source": [
        "## 推奨アップグレード手順\n",
        "\n",
        "このガイドの残りの部分では、アップグレードスクリプトの使用方法を説明します。アップグレードスクリプトは簡単に使用できますが、次の手順の一環として使用することを強く推奨します。\n",
        "\n",
        "1. **単体テスト**: アップグレード対象のコードにカバレッジ率が適度な単体テストスイートを確実に用意します。このコードは Python で記述されているため、さまざまなミスから保護されることはありません。また、すべての依存物が TensorFlow 2.0 との互換性を確保できるようにアップグレード済みであることを確認してください。\n",
        "\n",
        "2. **TensorFlow 1.14 のインストール**: TensorFlow を最新の TensorFlow 1.x バージョン（1.14 以上）にアップグレードします。このバージョンには `tf.compat.v2` に最終的な TensorFlow 2.0 API が含まれています。\n",
        "\n",
        "3. **1.14 でテスト**: この時点で単体テストに合格することを確認します。単体テストはアップグレード中に何度も実行することになるため、安全な状態で開始することが重要です。\n",
        "\n",
        "4. **アップグレードスクリプトの実行**: テストを含むソースツリー全体で `tf_upgrade_v2` を実行します。これにより、TensorFlow 2.0 で利用できるシンボルのみを使用する形式にコードがアップグレードされます。廃止されたシンボルは `tf.compat.v1` でアクセスできます。このようなシンボルは最終的には手動での対応が必要ですが、すぐに対応する必要はありません。\n",
        "\n",
        "5. **変換後のテストを TensorFlow 1.14 で実行**: コードは引き続き TensorFlow 1.14 で正常に動作するはずです。もう一度単体テストを実行してください。テストで何らかのエラーが発生する場合は、アップグレードスクリプトにバグがあります。その場合は[お知らせください](https://github.com/tensorflow/tensorflow/issues)。\n",
        "\n",
        "6. **アップグレードレポートの警告とエラーを確認**: このスクリプトは再確認が必要な変換や、必要な手動対応を説明するレポートファイルを書き出します。たとえば、残っているすべての contrib インスタンスを手動で削除する必要がある場合などです。[RFC で詳細](https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md)を確認してください。\n",
        "\n",
        "7. **TensorFlow 2.0 のインストール**: この時点で TensorFlow 2.0 に切り替えても安全です。\n",
        "\n",
        "8. **`v1.disable_v2_behavior` でのテスト**: テストの main 関数で `v1.disable_v2_behavior()` を使用してテストをもう一度実行すると、1.14 で実行した場合と同じ結果になるはずです。\n",
        "\n",
        "9. **V2の動作を有効化**: テストが v2 API を使用して動作するようになったため、v2 の動作をオンにすることを検討し始めることができます。コードの記述方法によっては、若干の変更が必要になる場合があります。詳細については、[移行ガイド](migrate.ipynb)を参照してください。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6pwSAQEwvscP"
      },
      "source": [
        "## アップグレードスクリプトの使用\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "I9NCvDt5GwX4"
      },
      "source": [
        "### セットアップ\n",
        "\n",
        "始める前に、TensorlFlow 2.0 がインストールされていることを確認してください。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "DWVYbvi1WCeY"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf\n",
        "\n",
        "print(tf.__version__)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ycy3B5PNGutU"
      },
      "source": [
        "テスト対象のコードがある [tensorflow/models](https://github.com/tensorflow/models) git リポジトリをクローンします。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jyckoWyAZEhZ"
      },
      "outputs": [],
      "source": [
        "!git clone --branch r1.13.0 --depth 1 https://github.com/tensorflow/models"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wfHOhbkgvrKr"
      },
      "source": [
        "### ヘルプを読む\n",
        "\n",
        "スクリプトは TensorFlow と共にインストールされています。組み込みのヘルプは次のとおりです。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m2GF-tlntqTQ"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 -h"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "se9Leqjm1CZR"
      },
      "source": [
        "### TF1 のコード例"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "whD5i36s1SuM"
      },
      "source": [
        "単純な TensorFlow 1.0 のスクリプトは次のとおりです。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "mhGbYQ9HwbeU"
      },
      "outputs": [],
      "source": [
        "!head -n 65 models/samples/cookbook/regression/custom_regression.py | tail -n 10"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UGO7xSyL89wX"
      },
      "source": [
        "TensorFlow 2.0 がインストールされている状態では動作しません。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TD7fFphX8_qE"
      },
      "outputs": [],
      "source": [
        "!(cd models/samples/cookbook/regression &amp;&amp; python custom_regression.py)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iZZHu0H0wLRJ"
      },
      "source": [
        "### 単一ファイル\n",
        "\n",
        "アップグレードスクリプトは単体の Python ファイルに対して実行できます。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "xIBZVEjkqkc5"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "  --infile models/samples/cookbook/regression/custom_regression.py \\\n",
        "  --outfile /tmp/custom_regression_v2.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "L9X2lxzqqkc9"
      },
      "source": [
        "コードの修正策が見つからない場合、スクリプトはエラーを出力します。 "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "r7zpuE1vWSlL"
      },
      "source": [
        "### ディレクトリツリー"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2q7Gtuu8SdIC"
      },
      "source": [
        "この単純な例を含む一般的なプロジェクトでは、複数のファイルが使用されています。通常はパッケージ全体をアップグレードするため、スクリプトをディレクトリツリーに対して実行することもできます。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XGqcdkAPqkc-"
      },
      "outputs": [],
      "source": [
        "# upgrade the .py files and copy all the other files to the outtree\n",
        "!tf_upgrade_v2 \\\n",
        "    --intree models/samples/cookbook/regression/ \\\n",
        "    --outtree regression_v2/ \\\n",
        "    --reportfile tree_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2S4j7sqbSowC"
      },
      "source": [
        "`dataset.make_one_shot_iterator` 関数に関して警告が 1 つ表示されていることに注意してください。\n",
        "\n",
        "これで、スクリプトが TensorFlow 2.0 で動作するようになりました。\n",
        "\n",
        "`tf.compat.v1` モジュールのため、変換後のスクリプトは TensorFlow 1.14 でも実行されることに注意してください。 "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "vh0cmW3y1tX9"
      },
      "outputs": [],
      "source": [
        "!(cd regression_v2 && python custom_regression.py 2>&1) | tail"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4EgZGGkdqkdC"
      },
      "source": [
        "## 詳細レポート\n",
        "\n",
        "このスクリプトは、詳細な変更のリストも報告します。この例では安全でない可能性のある変換が 1 つ検出され、ファイルの先頭で警告が表示されています。 "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CtHaZbVaNMGV"
      },
      "outputs": [],
      "source": [
        "!head -n 20 tree_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1-UIFXP3cFSa"
      },
      "source": [
        "再度 `Dataset.make_one_shot_iterator function` に関して警告が 1 つ表示されていることに注意してください。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oxQeYS1TN-jv"
      },
      "source": [
        "その他の場合、重要な変更の根拠が出力されます。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WQs9kEvVN9th"
      },
      "outputs": [],
      "source": [
        "%%writefile dropout.py\n",
        "import tensorflow as tf\n",
        "\n",
        "d = tf.nn.dropout(tf.range(10), 0.2)\n",
        "z = tf.zeros_like(d, optimize=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7uOkacZsO3XX"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "  --infile dropout.py \\\n",
        "  --outfile dropout_v2.py \\\n",
        "  --reportfile dropout_report.txt > /dev/null"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "m-J82-scPMGl"
      },
      "outputs": [],
      "source": [
        "!cat dropout_report.txt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DOOLN21nTGSS"
      },
      "source": [
        "変更されたファイルの内容は次のとおりです。スクリプトがどのように引数名を追加し、移動および名前変更された引数を処理しているかに注目してください。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "SrYcJk9-TFlU"
      },
      "outputs": [],
      "source": [
        "!cat dropout_v2.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wI_sVNp_b4C4"
      },
      "source": [
        "大規模なプロジェクトでは、若干のエラーが発生する可能性があります。たとえば、deeplab モデルを変換します。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "uzuY-bOvYBS7"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 \\\n",
        "    --intree models/research/deeplab \\\n",
        "    --outtree deeplab_v2 \\\n",
        "    --reportfile deeplab_report.txt > /dev/null"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FLhw3fm8drae"
      },
      "source": [
        "次のような出力ファイルが生成されました。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "4YYLRxWJdSvQ"
      },
      "outputs": [],
      "source": [
        "!ls deeplab_v2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qtTC-cAZdEBy"
      },
      "source": [
        "しかし、エラーが発生していました。レポートは、実行前に修正する必要があるものを正確に把握するのに役立ちます。最初の 3 つのエラーは次のとおりです。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "UVTNOohlcyVZ"
      },
      "outputs": [],
      "source": [
        "!cat deeplab_report.txt | grep -i models/research/deeplab | grep -i error | head -n 3"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gGBeDaFVRJ5l"
      },
      "source": [
        "## \"Safety\" モード"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BnfCxB7SVtTO"
      },
      "source": [
        "この変換スクリプトには `tensorflow.compat.v1` モジュールを使用するようにインポートを変更するだけの侵襲性の低い `SAFETY` モードもあります。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XdaVXCPWQCC5"
      },
      "outputs": [],
      "source": [
        "!cat dropout.py"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "c0tvRJLGRYEb"
      },
      "outputs": [],
      "source": [
        "!tf_upgrade_v2 --mode SAFETY --infile dropout.py --outfile dropout_v2_safe.py > /dev/null"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "91suN2RaRfIV"
      },
      "outputs": [],
      "source": [
        "!cat dropout_v2_safe.py"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EOzTF7xbZqqW"
      },
      "source": [
        "ご覧のとおり、このモードはコードをアップグレードしませんが、TensorFlow 1 のコードを TensorFlow 2 で実行できます。"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jGfXVApkqkdG"
      },
      "source": [
        "## 警告\n",
        "\n",
        "- このスクリプトを実行する前に手動でコードの一部をアップデートしないでください。特に、`tf.argmax` や `tf.batch_to_space` などの引数の順序が変更された関数により、既存コードを誤ってマッピングするキーワード引数が不正に追加されてしまいます。\n",
        "\n",
        "- このスクリプトは `tensorflow` が `import tensorflow as tf` を使用してインポートされていることを前提としています。\n",
        "\n",
        "- このスクリプトは引数の順序を変更しません。その代わり、キーワード引数を引数の順序が変更された関数に追加します。\n",
        "\n",
        "- GitHub リポジトリ内の Jupyter ノートブックと Python ファイルをアップグレードするための便利なツールについては、[tf2up.ml](http://tf2up.ml) をチェックしてください。\n",
        "\n",
        "アップグレードスクリプトのバグの報告または機能リクエストを行うには、[GitHub](https://github.com/tensorflow/tensorflow/issues) で課題を報告してください。また、TensorFlow 2.0 をテストしている場合は結果をお聞かせください！[TF 2.0 テストコミュニティ](https://groups.google.com/a/tensorflow.org/forum/#!forum/testing)に参加し、質問や議論を [testing@tensorflow.org](mailto:testing@tensorflow.org) 宛に投稿してください。"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "upgrade.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
